package com.cskaoyan.javase.array._4operation._3curd;

import java.util.Scanner;

/**
 *
 * @since 13:50
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo3 {
    public static void main(String[] args) {
        String[] names = new String[10];
        names[0] = "吴亦凡";
        names[1] = "肖战";
        names[2] = "鹿晗";
        names[3] = "蔡徐坤";
        names[4] = "刘亦菲";
        printNames(names);
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入要插入的名字:");
        String nameInsert = sc.nextLine();
        switch (createName(names, nameInsert)) {
            case 0:
                System.out.println("插入成功!");
                printNames(names);
                break;
            case 1:
                System.out.println("姓名重复,插入失败!");
                printNames(names);
                break;
            case 2:
                System.out.println("数组已满,插入失败!");
                printNames(names);
                break;
        }
    }

    /**
     *  去除掉null元素,仅打印实际姓名
     * @param names 被打印的名字数组
     * @author wuguidong@cskaoyan.onaliyun.com
     * @since 2022/03/24 10:58
     */
    public static void printNames(String[] names) {
        System.out.println("姓名列表:");
        System.out.print("[");
        for (String name : names) {
            if (name == null) {
                continue;
            }
            System.out.print(name + ", ");
        }
        System.out.println("\b\b]");
    }

    /**
     * 插入一个名字到String数组中,
     *  但是要求姓名具有唯一性
     *
     *  方法的返回值是一个int状态码:
     *      0: 表示插入成功
     *      1: 表示姓名重复,插入失败
     *      2: 表示数组已满,插入失败
     *
     * @param names 被新增的名字
     * @param target 被新增名字的数组
     * @return int
     * @author wuguidong@cskaoyan.onaliyun.com
     * @since 2022/03/24 11:01
     */
    public static int createName(String[] names, String target) {
        // 首先判断要插入名字的唯一性
        for (String name : names) {
            if (target.equals(name)) {
                // 名字已经重复了,禁止插入
                return 1;
            }
        }
        // 代码运行到这里,name肯定是不重复的,可以插入
        /*for (int i = 0; i < names.length; i++) {
            if (names[i] == null) {
                // 找到为null的位置,赋值
                names[i] = target;
                // 插入名字成功!
                return 0;
            }
        }*/
        // 查找一个为null的位置,然后插入
        int targetIndex = getIndexByRetrieveName(names, null);
        if (targetIndex != -1) {
            names[targetIndex] = target;
            // 插入成功
            return 0;
        }
        // 如果遍历整个数组都没有插入成功,说明数组满了,没有null的位置了
        return 2;
    }

    /**
     * true表示删除成功
     * false表示删除失败,因为找不到这个元素
     * @param names 被删除的name
     * @param target 被删除元素的String数组
     * @return boolean
     * @author wuguidong@cskaoyan.onaliyun.com
     * @since 2022/03/24 11:25
     */
    public static boolean delName(String[] names, String target) {
        // 遍历查找target元素,删除
        for (int i = 0; i < names.length; i++) {
            if (target.equals(names[i])) {
                // 找到该元素,赋值为null 表示删除
                names[i] = null;
                return true;
            }
        }
        // 没找到这个元素,删除失败
        return false;
    }

    /**
     *  修改成功返回true
     *  修饰失败,因为没有找到目标元素,返回false
     * @param names 被修改name的String数组
     * @param target 被修改的名字
     * @param newName 修改后的名字取值
     * @return boolean
     * @author wuguidong@cskaoyan.onaliyun.com
     * @since 2022/03/24 11:37
     */
    public static boolean updateName(String[] names, String target, String newName) {
        // 要修改,需要先找到这个名字
        for (int i = 0; i < names.length; i++) {
            if (target.equals(names[i])) {
                // 找到修改的目标
                names[i] = newName;
                return true;
            }
        }
        // 没有找到目标元素,修改失败!
        return false;
    }

    /**
     *  如果能够正常查找到目标元素,那么返回下标
     *  如果方法返回-1,表示没找到该元素
     *
     * @param names 被查找元素的String数组
     * @param target 被查找的目标元素
     * @return int
     * @author wuguidong@cskaoyan.onaliyun.com
     * @since 2022/03/24 11:43
     */
    public static int getIndexByRetrieveName(String[] names, String target) {
        int targetIndex = -1;
        for (int i = 0; i < names.length; i++) {
            // 做判断,判断target不等于null时,才去查找元素
            if (target == null) {
                // 查找为null的位置
                if (names[i] == null) {
                    targetIndex = i;
                    break;
                }
                // 如果该次循环没有找到null元素的位置,需要跳过该次循环,继续下次循环,寻找null的位置
                continue;
            }
            if (target.equals(names[i])) {
                targetIndex = i;
            }
        }
        return targetIndex;
    }
}
